#include "systick.h"

static u8  fac_us=0;							//<us延时倍乘数			   
static u16 fac_ms=0;							//<ms延时倍乘数
/*****************************************************************************
 * @name       :void SysTick_Init(u8 SYSCLK)
 * @date       :2021.6.6 
 * @function   :滴答定时器初始化
 * @param 		 :u8 SYSCLK		系统时钟
 * @retvalue   :None
******************************************************************************/
void SysTick_Init(u8 SYSCLK)
{
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
	fac_us=SYSCLK/8;						//SYSCLK的8分频 保存1us所需的计数次数
	fac_ms=(u16)fac_us*1000;				//每个ms需要的systick时钟数
}
/*****************************************************************************
 * @name       :void delay_us(u32 us)
 * @date       :2021.6.6 
 * @function   :滴答定时器定时设置
 * @param 		 :u32 us		定时时间(us)
 * @retvalue   :None
******************************************************************************/
void delay_us(u32 us)
{		
	u32 temp;	    	 
	SysTick->LOAD=us*fac_us; 				//时间加载	  		 
	SysTick->VAL=0x00;        				//清空计数器
	SysTick->CTRL|=0x01 ; //开始倒数 	 
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));	//等待时间到达   
	SysTick->CTRL&=~0x01; //关闭计数器
	SysTick->VAL =0X00;       				//清空计数器 
}
/*****************************************************************************
 * @name       :void delay_nms(u16 nms)
 * @date       :2021.6.6 
 * @function   :滴答定时器定时设置
 * @param 		 :u16 nms		定时时间(ms)
 * @retvalue   :None
******************************************************************************/
void delay_nms(u16 nms)
{	 		  	  
	u32 temp;		   
	SysTick->LOAD=(u32)nms*fac_ms;			//时间加载(SysTick->LOAD为24bit)
	SysTick->VAL =0x00;           			//清空计数器
	SysTick->CTRL|=0x01 ; //开始倒数 
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));	//等待时间到达   
	SysTick->CTRL&=~0x01; //关闭计数器
	SysTick->VAL =0X00;     		  		//清空计数器	  	    
}
/*****************************************************************************
 * @name       :void delay_ms(u16 ms)
 * @date       :2021.6.6 
 * @function   :定时设置
 * @param 		 :u16 ms：要延时的ms数 0~65535(ms)
 * @retvalue   :None
******************************************************************************/
void delay_ms(u16 ms)
{	 	 
	u8 repeat=ms/540;		//这里用540,是考虑到某些客户可能超频使用,
							//比如超频到248M的时候,delay_nms最大只能延时541ms左右了
	u16 remain=ms%540;
	while(repeat)
	{
		delay_nms(540);
		repeat--;
	}
	if(remain)delay_nms(remain);
}
